package com.elitesland.system.service;

import com.elitesland.core.base.PagingVO;
import com.elitesland.security.service.entity.JwtUserDto;
import com.elitesland.system.entity.SysUserDO;
import com.elitesland.system.entity.SysUserDTO;
import com.elitesland.system.param.SysPasswordUpdate;
import com.elitesland.system.param.SysUserNewParam;
import com.elitesland.system.param.SysUserQueryParam;
import com.elitesland.system.param.SysUserUpdateParam;
import com.elitesland.system.vo.SysPermissionVO;
import com.elitesland.system.vo.SysRoleVO;
import com.elitesland.system.vo.SysUserVO;
import org.springframework.data.domain.PageRequest;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.List;
import java.util.Optional;
import java.util.Set;

/**
 * <pre>
 * 系统用户操作逻辑服务类
 * </pre>
 *
 * @author Mir
 * @date 2020/6/16
 */
public interface SysUserService {

    /**
     * 根据查询条件检索用户信息
     * @param param 查询条件对象
     * @return 用户信息集合
     */
    PagingVO<SysUserVO> search(SysUserQueryParam param);

    Optional<SysUserDTO> getById(Long id);

    List<SysUserDO> getByIds(List<Long> ids);

    /**
     * 根据用户账号，返回所有的用户信息，包括密码和角色清单
     *
     * @param username 用户账号
     * @return 对应的用户信息
     */
    Optional<SysUserDTO> getUserByUsernameSec(String username);

    /**
     * 模糊查询用户名
     * author: Alvy.Yin
     */
    Optional<SysUserVO> getUserByUsernameContaining(String username);

    /**
     * 根据用户账号，返回脱敏的用户信息，VO
     *
     * @param username 用户账号
     * @return 脱敏的用户信息
     */
    Optional<SysUserVO> getUserByUsername(String username);

    /**
     * 判断对应用户账号是否存在
     *
     * @param username 用户账号
     * @return 是否存在
     */
    boolean isUserExists(String username);

    /**
     * 根据用户账号，返回对应Spring Security用UserDetails对象
     *
     * @param username 用户账号
     * @return UserDetails信息
     */
    Optional<UserDetails> loadUserDetailsByUsername(String username);

    /**
     * 创建新用户
     * @param user 用户账号信息
     * @return 新用户账号ID
     */
    Long create(SysUserNewParam user);

    void update(SysUserUpdateParam user);

    void changePasswordNoSec(Long userId, String newPassword);

    Boolean switchUserStatus(Long id);

    Set<SysRoleVO> listRolesByUsername(String username);

    Optional<JwtUserDto> current();

    List<SysPermissionVO> currentMenu();

    Set<SysPermissionVO> currentActions();

    Set<SysPermissionVO> currentMenuActions(Long menuId);

    PagingVO<SysUserVO> listUsersBySourceType(String sourceType, PageRequest pageRequest);

    /**
     * 根据用户ID启用用户
     * @param id 用户ID
     */
    void enableById(Long id);

    /**
     * 根据用户ID禁用用户
     * @param id 用户ID
     */
    void disableById(Long id);

    Optional<SysUserVO> findByMobile(String mobile);

    void removeByBatch(List<Long> userIds);

    List<SysUserDO> getUnTransUser();

    Integer setTransFlag(List<Long> ids, Integer transFlag);

    void deleteBatch(List<Long> idList);

    List<SysUserDO> getUnTransUser(List<Long> susUsrIDs);

    void updatePassword(SysPasswordUpdate update);
}
